package com.ztf.ai.ticket;

import com.alibaba.fastjson2.JSONObject;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TicketDemandParseService {

    private final ChatModel chatModel;

    public TicketDemandParseService(OllamaChatModel chatModel) {
        this.chatModel = chatModel;
    }

    public static final String promptTemplate = """
            请将用户的抢票需求解析为JSON格式，字段说明如下：
            - date：出行日期，格式yyyy-MM-dd，如用户说“10月1日”则转为当年的“2024-10-01”
            - fromStation：出发站，需是标准站名（如“北京”→“北京南站”需确认，若模糊则默认“北京西站”）
            - toStation：到达站，同出发站标准
            - trainNo：车次号，如G1、D23
            - seatType：座位类型，仅保留“二等座”“一等座”“商务座”“无座”
            注意：若需求中某字段缺失（如未说座位类型），默认填充“二等座”；若有歧义需合理推测，无需追问用户。
            用户需求：%s
            输出仅保留JSON，不要额外文字！
            """;

    /**
     * 解析用户口语化需求
     *
     * @param userDemand 用户需求（如“帮我抢10月1日北京到上海的G1次二等座”）
     * @param userId     用户ID（关联预设的身份信息）
     * @return 结构化的抢票任务DTO
     */
    public TicketTaskDTO parseDemand(String userDemand, String userId) {
        // 1. 定义Qwen2.5的提示词模板，明确解析格式

        Prompt prompt = new Prompt(List.of(
                new SystemMessage(promptTemplate),
                new UserMessage(userDemand)
        ));
        String aiResponse = chatModel.call(prompt).getResult().getOutput().getText();
        int beginIdx = aiResponse.lastIndexOf("{");
        TicketTaskDTO taskDTO = JSONObject.parseObject(aiResponse.substring(beginIdx), TicketTaskDTO.class);
        taskDTO.setTaskId("TASK_" + System.currentTimeMillis()); // 生成唯一任务ID
        taskDTO.setUserId(userId);
        return taskDTO;
    }
}